window = {};
var fn = function () {
    console.log("我是函数");
}

fn();

// js 所有的函数都有两个特殊的方法
// fn.call()
// fn.apply()

// call 叫调用
// fn.call();  // 就可以运行函数
fn.call();
fn.apply();

// 之前 -> 构造函数
function Person(name) {
    this.name = name;
}

// 普通函数
Person.prototype.chi = function () {
    // this
    console.log(this.name, ":就爱吃！");
}

var pp = new Person("alen");
pp.chi();

// call 和 apply 的逻辑

window.name = "我是window";

function Man(name) {
    this.name = name;
}

// 普通方法
Man.prototype.chi = function () {
    // this
    console.log(this.name, "俺也喜欢吃！");
}

var p = new Man("Hellen");
var m = new Man("chris");

// 通过call这种方式来访问函数，默认情况下，就是一个普通函数
// 的调用， 此时   this没有被指向过
// 此时的this是 window
p.chi.call();
m.chi.call();

// 可以改变this的指向
// function.call(this指向谁)  函数本身需要其他的参数
Man.prototype.chi.call(p); // 相当于 p.chi()
Man.prototype.chi.call(m); // 相当与 pp.chi()
p.chi.call(m);

// p.方法
p.chi(); // 必须得在原型链上
Man.prototype.chi.call("对象");// 框架设计

function func() {
    console.log(this.name, "哈哈哈哈");
}

func();

// 更规范
// p.chi(); //之所以可以这样访问一个方法，原因时chi在
// p的原型链上   p.__proto__
// 普适性
Man.prototype.chi.call({name: "娃哈哈"});// 此时这种调用，就不需要对象的原型上必须要有某个方法

// 恶心人
Man['prototype']['chi']['call']()

var s = "hehe";
s.charCodeAt(0)
s.charCodeAt(0)
s.charCodeAt(0)

String.prototype.charCodeAt.call(s, 0); // s.charCodeAt()
console.log(s);

function Man(name) {
    this.name = name;
}

// 普通方法
Person.prototype.chi = function (zhu, cai, tang) {
    // this
    console.log(this.name, "喜欢吃东西", zhu, cai, tang)
}

var p = new Person("cxk");
// 正常调用

p.chi("大米饭", "西红柿炒鸡蛋", "冬瓜吨烤肠");
// call 调用， 第二个位置以后的内容 作为 目标函数的参数
Person.prototype.chi.call(p, "大米饭", "西红柿炒鸡蛋", "冬瓜吨烤肠");

// apply 的逻辑和 call是一样的

function Man(name) {
    this.name = name;
}

// 普通方法
Man.prototype.chi = function (zhu, cai) {
    //this
    console.log(this.name, "吃东西", zhu, cai);
}

var m = new Man("黑辣椒");
m.chi("米饭", "拍黄瓜");
// apply,给函数传递参数是在第二个参数传递的，一般封装一个数组进行传递
Man.prototype.chi.apply(m, ["米饭", "拍黄瓜"]);

// 和上面的逻辑没有关系的一个东西
function fun(a, b, c, d, e) {
    console.log(arguments); // 所有的函数都有这样一个固定变量，装载的就是函数传递过来的参数
    // console.log(a + b + c);
    if (arguments.length == 2) {
        console.log(a + b);
    } else if (arguments.length == 3) {
        console.log(a + b + c);
    } else if (arguments.length === 4) {
        console.log(a + b + c + d);
    } else {
        console.log(a + b + c + d + e)
    }
}

fun(1);
fun(1, 2);
fun(1, 2, 3);
fun(1, 2, 3, 4);
fun(1, 2, 3, 4, 5);

















